package com.leetcode.algorithm.y21.m07;

/**
 * https://leetcode-cn.com/study-plan/algorithms/?progress=dqpwag
 * 第 4 天 双指针
 * 
 * @author jie.deng
 *
 */
public class Algorithms04 {
	
    /**
     * 344. 反转字符串
     * 
     * 编写一个函数，其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
     * 不要给另外的数组分配额外的空间，你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
     * 你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
     * 
     * 示例 1：
     * 
     * 输入：["h","e","l","l","o"]
     * 输出：["o","l","l","e","h"]
     * 示例 2：
     * 
     * 输入：["H","a","n","n","a","h"]
     * 输出：["h","a","n","n","a","H"]
     * @param s
     * @return
     */
    public void reverseString(char[] s) {
        int l = 0;
        int r = s.length - 1;
        while (l < r) {
            char tmp = s[l];
            s[l++] = s[r];
            s[r--] = tmp;
        }
    }
    
    
    /**
     * 557. 反转字符串中的单词 III
     * 给定一个字符串，你需要反转字符串中每个单词的字符顺序，同时仍保留空格和单词的初始顺序。
     * 
     * 示例 1:
     * 
     * 输入: "Let's take LeetCode contest"
     * 输出: "s'teL ekat edoCteeL tsetnoc" 
     * 注意：在字符串中，每个单词由单个空格分隔，并且字符串中不会有任何额外的空格。
     * @param s
     * @return
     */
	public String reverseWordsIII(String s) {
		StringBuffer ret = new StringBuffer();
		int len = s.length();
		int idx = 0;
		while (idx < len) {
			int wordCnt = 0;
			while (idx < len && s.charAt(idx) != ' ') {
				idx++;
				wordCnt++;
			}
			for (int i = 1; i <= wordCnt; i++) {
				ret.append(s.charAt(idx - i));
			}
			while (idx < len && s.charAt(idx) == ' ') {
				idx++;
				ret.append(' ');
			}
		}

		return ret.toString();
	}
}
